package sword_offer;

import java.util.Deque;
import java.util.LinkedList;

/**
 * @ClassName _31ValidateStackSequences
 * @Description: 输入两个整数序列，第一个序列表示栈的压入顺序，请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如，序列 {1,2,3,4,5} 是某栈的压栈序列，序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列，但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
 * @Author: yongliang.ma
 * @Create_time:2022/10/10 13:24
 */
public class _31ValidateStackSequences {

    public static void main(String[] args) {
        int[] pushed =  new int[]{1,2,3,4,5};
        int[] popped =  new int[]{4,3,5,1,2};
        boolean b = new _31ValidateStackSequences().validateStackSequences(pushed, popped);
        System.out.println(b);
    }

    public boolean validateStackSequences(int[] pushed, int[] popped) {
        if (pushed.length != popped.length)
            return false;
        if (pushed.length == 0 && popped.length == 0)
            return true;

        Deque<Integer> stack = new LinkedList<>();
        int indexPushed = 0, indexPopped = 0;
        while (indexPushed < pushed.length){
            if (stack.isEmpty() || stack.peek() != popped[indexPopped]){
                stack.push(pushed[indexPushed++]);
                continue;
            } else {
                stack.pop();
                indexPopped++;
            }
        }
        while (!stack.isEmpty()){
            if (stack.peek() == popped[indexPopped]){
                stack.pop();
                indexPopped++;
            }else {
                return false;
            }
        }

        return true;
    }
}
